package es.caeboxapps.game.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.facebook.FacebookRequestError;
import com.facebook.HttpMethod;
import com.facebook.Request;
import com.facebook.RequestAsyncTask;
import com.facebook.Response;
import com.facebook.Session;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import es.caeboxapps.game.GameApplication;
import es.caeboxapps.game.MenuActivity;
import es.caeboxapps.game.QuestionActivity;
import es.caeboxapps.game.R;
import es.caeboxapps.game.models.Pregunta;
import es.caeboxapps.game.models.Respuesta;

public class Utils {

	public Utils() {
	}

	public static List<Pregunta> getQuestions(Context context) {
		try {
			// BufferedReader reader = new BufferedReader(new InputStreamReader(
			// context.getAssets().open("Preguntas.json"), "ISO-8859-1"));
			// String mLine = reader.readLine();
			// while (reader.readLine() != null) {
			// mLine = mLine + reader.readLine();
			// }
			//
			// reader.close();
			List<Pregunta> listaPreguntas = new ArrayList<Pregunta>();
			// To load text file
			InputStream input;
			try {
				input = context.getAssets().open(
						"preguntas" + GameApplication.nivelPartida + ".json");
				BufferedReader br = new BufferedReader(new InputStreamReader(
						input, "ISO-8859-1"));
				String line;
				String txt = "";
				while ((line = br.readLine()) != null)
					txt = txt + line;

				listaPreguntas = parseJsonPreguntas(new JSONArray(txt));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			return listaPreguntas;
		} catch (Exception e) {
			return null;
		}

	}

	// ------------------------------------------------------------------------
	// PARSE JSON PREGUNTAS
	// ------------------------------------------------------------------------
	private static List<Pregunta> parseJsonPreguntas(JSONArray jsonarray) {
		List<Pregunta> listaPreguntas = new ArrayList<Pregunta>();
		try {

			for (int i = 0; i < jsonarray.length(); i++) {
				Pregunta pregunta = new Pregunta();
				JSONObject jsonobject = (JSONObject) ((JSONObject) jsonarray
						.get(i)).get("pregunta");
				pregunta.setIdPregunta(jsonobject.getInt("idPregunta"));
				pregunta.setPregunta(jsonobject.getString("texto"));
				pregunta.setTipo(jsonobject.getInt("tipo"));
				pregunta.setSaltarPregunta(jsonobject
						.getBoolean("saltarPregunta"));
				pregunta.setIdPregunta(jsonobject.getInt("idPregunta"));

				JSONArray jSONArrayRespuestas = jsonobject
						.getJSONArray("respuestas");
				List<Respuesta> listaRespuestas = new ArrayList<Respuesta>();
				for (int j = 0; j < jSONArrayRespuestas.length(); j++) {
					Respuesta respuesta = new Respuesta();
					JSONObject jsonobjectRespuesta = (JSONObject) jSONArrayRespuestas
							.getJSONObject(j).get("respuesta");

					respuesta.setIdRespuesta(jsonobjectRespuesta.getInt("id"));
					respuesta.setRespuesta(jsonobjectRespuesta
							.getString("respuesta"));
					respuesta.setEsCorrecta(jsonobjectRespuesta
							.getBoolean("esCorrecta"));
					listaRespuestas.add(respuesta);
				}
				pregunta.setListaRespuestas(listaRespuestas);

				listaPreguntas.add(pregunta);

			}
		} catch (Exception e) {

		}
		return listaPreguntas;
	}

	// ----------------------------------------------------------------------------
	// MOSTRAR DIALOG SALTAR PREGUNTA
	// ----------------------------------------------------------------------------
	public static void mostrarDialogSaltarPregunta(final Activity activity) {
		final Dialog dialog = new Dialog(activity);
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		dialog.setContentView(R.layout.dialog_saltar_pregunta);
		Button buttonSi = (Button) dialog.findViewById(R.id.buttonSi);
		Button buttonNo = (Button) dialog.findViewById(R.id.buttonNo);

		buttonSi.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				GameApplication.numeroSaltos--;
				Utils.cargarSiguientePregunta(activity);
				dialog.dismiss();
			}
		});
		buttonNo.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dialog.dismiss();
			}
		});

		dialog.show();
	}

	// --------------------------------------------------------------------------------
	// CARGAR SIGUIENTE PREGUNTA
	// ---------------------------------------------------------------------------------
	public static void cargarSiguientePregunta(Activity activity) {
		GameApplication.posicionPreguntaActual++;

		Intent intent = new Intent(activity, QuestionActivity.class);
		activity.startActivity(intent);
		activity.overridePendingTransition(R.anim.slide_left_right,
				R.anim.slide_left_right);
		activity.finish();

		// } else {
		// Intent intent = new Intent(activity, LaberintoActivity.class);
		// activity.startActivity(intent);
		// activity.finish();
		// }
	}

	// ----------------------------------------------------------------------
	// SET NUMERO SALTOS
	// ----------------------------------------------------------------------
	public static void setNumeroSaltos(LinearLayout linearLayoutSaltos) {
		ImageView salto1 = (ImageView) linearLayoutSaltos
				.findViewById(R.id.salto1);
		ImageView salto2 = (ImageView) linearLayoutSaltos
				.findViewById(R.id.salto2);
		ImageView salto3 = (ImageView) linearLayoutSaltos
				.findViewById(R.id.salto3);
		ImageView salto4 = (ImageView) linearLayoutSaltos
				.findViewById(R.id.salto4);

		switch (GameApplication.numeroSaltos) {
		case 1:
			salto1.setImageResource(R.drawable.cabeza_gili);
			// salto1.setBackgroundResource(R.drawable.cabeza_gili);
			break;
		case 2:
			salto1.setImageResource(R.drawable.cabeza_gili);
			salto2.setImageResource(R.drawable.cabeza_gili);
			break;
		case 3:
			salto1.setImageResource(R.drawable.cabeza_gili);
			salto2.setImageResource(R.drawable.cabeza_gili);
			salto3.setImageResource(R.drawable.cabeza_gili);
			break;
		case 4:
			salto1.setImageResource(R.drawable.cabeza_gili);
			salto2.setImageResource(R.drawable.cabeza_gili);
			salto3.setImageResource(R.drawable.cabeza_gili);
			salto4.setImageResource(R.drawable.cabeza_gili);
			break;
		default:
			break;
		}

	}

	// -----------------------------------------------------------------
	// PUNTUACION
	// -----------------------------------------------------------------

	static final int VELOCIDAD = 10; // Velocidad en milisegundos
	static Timer timer;
	static TimerTask task;
	static int puntuacion = 0;
	static int TIEMPO = GameApplication.TIEMPO_MAX;

	public static boolean terminarTimerTask() {
		task.cancel();
		if (puntuacion > 0) {
			GameApplication.Puntuacion = GameApplication.Puntuacion
					+ (TIEMPO / puntuacion);
		}
		puntuacion = 0;

		System.out.println(GameApplication.Puntuacion
				+ " PUNTUACIONNNNNNNNNNNNNNNNNNNNN");
		return true;
	}

	public static void iniciarTiempo_Puntos() {
		task = new TimerTask() {
			@Override
			public void run() {
				puntuacion++;
				System.out.println("puntuacion: " + puntuacion);

				if (puntuacion >= TIEMPO) {
					puntuacion = TIEMPO;
				}
			}
		};

		Timer timer = new Timer();
		timer.schedule(task, VELOCIDAD, VELOCIDAD);

	}
	
	
	// -----------------------------------------------------------------
	// Publicar Mensaje en Facebook
	// -----------------------------------------------------------------
	
	private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
	private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
	private static boolean pendingPublishReauthorization = false;
	
	public static void publishStory(Activity activity, String nombre, String resumen,String descripcion, String link, String urlImagen) {
		final Activity mi_activity = activity;
		
		Session session = Session.getActiveSession();

		if (session != null) {

			// Check for publish permissions
			List<String> permissions = session.getPermissions();
			if (!isSubsetOf(PERMISSIONS, permissions)) {
				pendingPublishReauthorization = true;
				Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
						mi_activity, PERMISSIONS);
				session.requestNewPublishPermissions(newPermissionsRequest);
				return;
			}

			Bundle postParams = new Bundle();
			postParams.putString("name", "Prueba de Mensaje enviado desde Android");
			postParams.putString("caption",
					"Resumen: Mensaje enviado desde mi app");
			postParams
					.putString(
							"description",
							"Aqui va una descripcion");
			postParams.putString("link",
					"https://play.google.com/store/apps/details?id=com.prueba.afinadroid");
			postParams
					.putString("picture",
							"https://lh5.ggpht.com/IIR9NlGBAimo9oE9E3ztwWX-hgqkE4hsD6Sxsmtuvqv3MGFqrNtZKzvcx4Jf2h_f1P4=w300");

			Request.Callback callback = new Request.Callback() {
				public void onCompleted(Response response) {
					JSONObject graphResponse = response.getGraphObject()
							.getInnerJSONObject();
					String postId = null;
					try {
						postId = graphResponse.getString("id");
					} catch (JSONException e) {
						Log.i("JSON error", "JSON error " + e.getMessage());
					}
					FacebookRequestError error = response.getError();
					if (error != null) {
						//Error al enviar el mensaje al timeline de Facebook
						Toast.makeText(mi_activity,
								error.getErrorMessage(), Toast.LENGTH_SHORT)
								.show();
					} else {
						//Mensaje enviado con exito al timeline
						Toast.makeText(mi_activity,"Id del mensaje enviado: "+
								postId, Toast.LENGTH_LONG).show();
					}
				}
			};

			Request request = new Request(session, "me/feed", postParams,
					HttpMethod.POST, callback);

			RequestAsyncTask task = new RequestAsyncTask(request);
			task.execute();
		}

	}
	
	private static boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
	    for (String string : subset) {
	        if (!superset.contains(string)) {
	            return false;
	        }
	    }
	    return true;
	}
	
	
}
